package de.haw.HES.Switch;

import java.util.List;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import de.haw.HES.Datentypen.Amount;
import de.haw.HES.Datentypen.AuftragTyp;
import de.haw.HES.Datentypen.Euro;
import de.haw.HES.Datentypen.KundeId;
import de.haw.HES.Datentypen.KundenTyp;
import de.haw.HES.Datentypen.ProduktId;
import de.haw.HES.Datentypen.ProduktTyp;
import de.haw.HES.Kundenmanagement.Kunde;
import de.haw.HES.Switch.pub.IDispatcher;
import de.haw.HES.Switch.pub.Konnektor;
import de.haw.HES.Switch.pub.MalFunctionInConnectorException;
import de.haw.HES.Warenmanagement.Produkt;
import de.haw.HES.Disposition.pub.DispositionAdapterService;

public class KonnektorDespImpl extends Konnektor {

	DispositionAdapterService dispoService;
	
	private DispositionAdapterService getDispoService() {
		if(dispoService == null) {
//			connectTo(dispoService,"DispositionAdapterService");
			try {
				dispoService = (DispositionAdapterService) Naming.lookup(this.server+de.haw.HES.Disposition.pub.DispositionAdapterService.SERVICE_NAME);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
		}
		return dispoService;
	}

	public KonnektorDespImpl(String url){
		super(url);
//		connectTo(url);
	}
	
//	private Object connectTo(Object classOfService,String serviceName){
//
//		try {
//			hesInst = (classOfService.getClass())Naming.lookup(serviceName);
//			return true;
//		} catch (Exception e) {
//			System.out.println ("KonnektorKonnektorDespImpl Fehler:" + e);
//		    return false;  
//		}
//
//	}

	@Override
	public void createReceipt(Euro amount, AuftragTyp auftrag) {
		return;
	}

	@Override
	public Boolean hasOrderInvoiceBeenPaid(AuftragTyp auftrag) {
		return false;
	}

	@Override
	public boolean hasBeenDelivered(Integer id) {
		System.err.println("INFO: Used server: " + server);
		try {
			return getDispoService().hasBeenDelivered(id);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			MalFunctionInConnectorException ex = new MalFunctionInConnectorException(e);
			throw ex;
		}
	}

	@Override
	public void createDeliveryForOrder(AuftragTyp auftrag, KundenTyp kunde) {
		try {
			getDispoService().createDeliveryForOrder(auftrag, kunde);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			MalFunctionInConnectorException ex = new MalFunctionInConnectorException(e);
			throw ex;
		}
	}

	@Override
	public Kunde getKundeById(KundeId id) {
		return null;
	}

	@Override
	public List<Kunde> getKundenByName(String name) {
		return null;
	}

	@Override
	public Produkt getProduktById(ProduktId id) {
		return null;
	}

	@Override
	public List<Produkt> getProdukteByName(String name) {
		return null;
	}

	@Override
	public Boolean hasSufficientAmountForProduct(ProduktTyp produkt,
			Amount amount) {
		return null;
	}

	@Override
	public void orderProductForOrder(ProduktTyp produkt, Amount amount,
			AuftragTyp auftrag) {
		return;
	}

	@Override
	public void orderNewProducts(ProduktTyp produkt, Amount auftrag) {
		return;
	}
	
}